package vista.paneles.hojaDibujo;

import java.awt.Point;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.swing.JComponent;
import javax.swing.JPanel;

import vista.Tema;
import vista.objetos.DiagramaGraficable;
import vista.objetos.GraficableConEtiqueta;

public class ControladorDeSeleccion {

    private Point ptoInicio = null;
    private Point ptoFin = null;
    private DiagramaGraficable diagramaActual;
    
    
    
    void dibujarSeleccion(GL2 gl)
    {
        if (this.getPuntoFin() == null)
        	return;
        
        float [] ptoInicioMund = UtilHojaDeDibujo.getCoordMundo(gl, this.getPuntoInicio());
        float [] ptoFinMund = UtilHojaDeDibujo.getCoordMundo(gl, this.getPuntoFin());

        gl.glColor3fv(Tema.getInstancia().getSeleccionColor());
        gl.glLineWidth(3);
        gl.glEnable(GL2.GL_LINE_STIPPLE);
        	gl.glLineStipple(5, (short) 0x1C47); /* dash/dot/dash */
        	this.drawOneLine(gl, ptoInicioMund[0], ptoInicioMund[1], ptoFinMund[0], ptoFinMund[1]);
      	gl.glDisable(GL2.GL_LINE_STIPPLE);
                    
       	gl.glLineWidth(1);
    }
    

    private void drawOneLine(GL2 gl, float x1, float y1, float x2, float y2)
    {
        gl.glBegin(GL.GL_LINE_LOOP);
        	gl.glVertex2f(x1, y1);
        	gl.glVertex2f(x2, y1);
        	gl.glVertex2f(x2, y2);
        	gl.glVertex2f(x1, y2);
        gl.glEnd();
    }
    
    public void seleccionar(Point ptoFin)
    {
    	if (this.getPuntoInicio() == null)
    		this.setPuntoInicio(new Point(ptoFin));

    	this.setPuntoFin(new Point(ptoFin));
    }

    public void cancelarSeleccion() 
    {
    	this.setPuntoInicio(null);
    	this.setPuntoFin(null);
    }
    

    public List<GraficableConEtiqueta> getObjetosSeleccionados()
    {
    	Iterator<GraficableConEtiqueta> itGraf = this.diagramaActual.getGraficables().iterator();
    	List<GraficableConEtiqueta> graficablesACopiar = new LinkedList<GraficableConEtiqueta>();

    	JComponent componenteSeleccion = crearPanelDeSeleccion();
    	
    	while(itGraf.hasNext())
    	{
    		GraficableConEtiqueta graf = itGraf.next();
    		
    		if (UtilHojaDeDibujo.estaContenido(componenteSeleccion, graf.getEtiqueta()))
    			graficablesACopiar.add(graf);
    	}
    	return graficablesACopiar;
    }

    public boolean hayUnObjetoSeleccionado()
    {
    	Iterator<GraficableConEtiqueta> itGraf = this.diagramaActual.getGraficables().iterator();

    	JComponent componenteSeleccion = crearPanelDeSeleccion();
    	while(itGraf.hasNext())
    	{
    		GraficableConEtiqueta graf = itGraf.next();
    		
    		if (UtilHojaDeDibujo.estaContenido(componenteSeleccion, graf.getEtiqueta()))
    			return true;
    	}
    	
    	return false;
    }

	private JComponent crearPanelDeSeleccion() 
	{
		JComponent componenteSeleccion = new JPanel();
		
    	int xMedio = (this.ptoInicio.x + this.ptoFin.x)/2,
    			yMedio = (this.ptoInicio.y + this.ptoFin.y)/2,
    			ancho = Math.abs(this.ptoFin.x - this.ptoInicio.x),
    			alto = Math.abs(this.ptoFin.y - this.ptoInicio.y);
    	
    	componenteSeleccion.setLocation(xMedio - ancho/2, yMedio - alto/2);
    	componenteSeleccion.setSize(ancho, alto);
    	
		return componenteSeleccion;
	}
	
	private Point getPuntoInicio() {
		return ptoInicio;
	}
	private void setPuntoInicio(Point ptoInicio) {
		this.ptoInicio = ptoInicio;
	}
	private Point getPuntoFin() {
		return ptoFin;
	}
	private void setPuntoFin(Point ptoFin) {
		this.ptoFin = ptoFin;
	}
	void setDiagramaActual(DiagramaGraficable diagActual) {
		this.diagramaActual = diagActual;
	}
}
